home *** CD-ROM | disk | FTP | other *** search
/ PC Media 22 / PC MEDIA CD22.iso / share / prog / txtmenu1 / txtmenu.cpp < prev    next >
C/C++ Source or Header  |  1993-01-01  |  10KB  |  396 lines

  1. /*
  2.         About       TXTMENU
  3.  
  4. This program is to generate a txt-menu in DOS. It is mainly for users to
  5. develop their own txt-based menu. It reads the .cfg file to get the menu
  6. contents and return diffrerent value to indicate the select result.
  7. It has wonderful sound effect and some time counting facility. Besides,
  8. it includes all SOURCE CODE !
  9.  
  10. To start it just type the exe file and the program will work.
  11.  
  12. With  SOURCE CODE , you can easily modify it for your own purpose.
  13. You can distribute the source code freely only together with this readme
  14. file. Since this is a shareware, you are required to register in order 
  15. to use it in your own program. It will only cost you $50. 
  16.  
  17. However, if you do not like to pay so much, you can also pay as much as you 
  18. wish to register. Just think the time and energe you will save by this
  19. program !
  20.  
  21. After you register for this program, you will get permission to 
  22. include the source code to your own program. Besides,you will also
  23. get more detailed comments of the source code and you can get answers
  24. from author about any programming problems without extra fee.
  25.  
  26. Money and Check should mail to:
  27.  
  28. Mr. Yongyong Xu,
  29. 1940 Howard Street. Apt. 333,
  30. Kalamazoo, MI 49008
  31. U.S.A.
  32.  
  33. Telephone: (616) 387-7569
  34. EMail:  yxu@cs.wmich.edu   (prefered)
  35.             or
  36.         99xu1@grog.lab.cc.wmich.edu
  37.  
  38. When you cannot reach me by the above address, try the next:
  39. -----------------------------------------------------------------------
  40. <Permanet Home Address>
  41.  
  42. Mr. Xu Yongyong,
  43. Building 34 Room 604,
  44. HuayuanXinCun , Chang Zhou
  45. Jiang Su Province 213016
  46. P.R.China
  47.  
  48. Tel:(86)-(519)-(328-0177)
  49.  
  50.  
  51. */
  52. #define __YYXMAIN
  53.  
  54. #include <conio.h>
  55. #include <math.h>
  56. #include <stdio.h>
  57. #include <string.h>
  58. #include <stdlib.h>
  59. #include <alloc.h>
  60. #include <dos.h>
  61. #include <time.h>
  62. #include <dir.h>
  63.  
  64. #ifdef __cplusplus
  65.   int max (int value1, int value2);
  66.   int max(int value1, int value2)
  67.   {
  68.      return ( (value1 > value2) ? value1 : value2);
  69.   }
  70. #endif
  71.  
  72. #include "siren.h"
  73.  
  74. #include "txtfunc.h"
  75.  
  76. // This program returns a value of menuitems;
  77. // And it should run with a .BAT and .BAT decide to run what program
  78. //
  79.  
  80. int menunum =0;
  81. int menudefault=0;
  82. int menuselect=0;
  83. int xmax=80;
  84. int ymax=25;
  85. int timechanged =0;
  86.  
  87. //struct  time timer;
  88. //struct date dater;
  89. time_t timer;       // Unix portable
  90.  
  91. int defaulttime=0;
  92. long count=0;
  93. char * menuitem[20];
  94. char * menucomment[20];
  95.  
  96.  
  97. char buf[255];
  98. char ch[2];
  99.  
  100. #define INTR 0X1C    /* The clock tick interrupt */
  101.  
  102. #ifdef __cplusplus
  103.     #define __CPPARGS ...
  104. #else
  105.     #define __CPPARGS
  106. #endif
  107.  
  108. void interrupt ( *oldhandler)(__CPPARGS);
  109. void no_quota(char *s);
  110. void interrupt handler(__CPPARGS);
  111. void readcfg(char *fname);
  112. int getmenu();
  113.  
  114. void interrupt handler(__CPPARGS)
  115. {
  116.     count++;
  117.     if (count % 18 == 0) {
  118.         timechanged =1;
  119.         defaulttime --;
  120.     }
  121.     oldhandler();
  122. }
  123.  
  124. void no_quota(char *s)
  125. {
  126.     if (s[0]=='\"') {
  127.         strcpy (s, s+1);
  128.     };
  129.     if (s[strlen(s)-1]=='\"') s[strlen(s)-1]=0;
  130. }
  131.  
  132.  
  133. void readcfg(char *fname)
  134. {
  135. //  #define CFGFILENAME "MENU.CFG"
  136.  
  137.   FILE * filecfg;
  138.  
  139.   char string[1024];
  140.   char substring[255];
  141.   char * ptr;
  142.   char ch;
  143.   int setup_flag =0;
  144.  
  145.     filecfg =fopen ( fname ,"r+t");
  146.     if ( filecfg == NULL ) return;
  147.     do {
  148.         fgets ( string, 1024, filecfg );
  149.         if feof ( filecfg ) break;
  150.         sscanf ( string, "%1s", substring );
  151.         if  ( strcmp( substring, "#" ) == 0 ) goto Next;
  152.         sscanf ( string, "%2s", substring );
  153.         if  ( strcmp( substring, "//" ) == 0 ) goto Next;
  154.  
  155.         substring[0]=0;
  156.         sscanf ( string, "%7s", substring );
  157.         if  ( strcmpi ( substring,"[SOUND]") == 0 ) {
  158.             setup_flag =2;      goto Next;
  159.         }
  160.  
  161.         if (setup_flag ==2) {
  162.             sscanf ( string, "%5s", substring );
  163.                 if ( strcmpi ( substring, "DELAY" ) == 0 ) {
  164.                     ptr = strchr ( string, '=' );
  165.                     ptr ++;
  166.                     sscanf ( ptr, "%d", &DELAY);
  167.                     goto Next;
  168.                 }
  169.             sscanf ( string, "%4s", substring );
  170.                 if ( strcmpi ( substring, "RATE" ) == 0 ) {
  171.                     ptr = strchr ( string, '=' );
  172.                     ptr ++;
  173.                     sscanf ( ptr, "%d", &RATE);
  174.                     goto Next;
  175.                 }
  176.         }
  177.  
  178.         substring[0]=0;
  179.         sscanf ( string, "%7s", substring );
  180.         if  ( strcmpi ( substring,"[TITLE]") == 0 ) {
  181.             fgets (title0, 80, filecfg );
  182.             if (title0[strlen(title0)-1]=='\n' )title0[strlen(title0)-1]=0;
  183.             fgets (title1, 80, filecfg );
  184.             if (title1[strlen(title1)-1]=='\n' )title1[strlen(title1)-1]=0;
  185.             goto Next;
  186.         }
  187.  
  188.         substring[0]=0;
  189.         sscanf ( string, "%7s", substring );
  190.         if  ( strcmpi ( substring,"[MENUS]") == 0 ) {
  191.                 setup_flag =1;              goto Next;
  192.         }
  193.         if (setup_flag ==1) {
  194.             sscanf ( string, "%11s", substring );
  195.                 if ( strcmpi ( substring, "MENUDEFAULT" ) == 0 ) {
  196.                     ptr = strchr ( string, '=' );
  197.                     ptr ++;
  198.                     sscanf ( ptr, "%d %d", &menudefault, &defaulttime);
  199.                     menudefault --; if ( menudefault <0 ) menudefault=0;
  200.                     goto Next;
  201.                 }
  202.             sscanf ( string, "%8s", substring );
  203.                 if ( strcmpi ( substring, "MENUITEM" ) == 0 ) {
  204.                     ptr = strchr ( string, '=' );
  205.                     ptr ++;
  206.                     menuitem[menunum] = (char * )calloc(256, sizeof(char));
  207.                     if (menuitem[menunum]==NULL) exit(-1);
  208.                     menucomment[menunum] = (char * )calloc(256, sizeof(char));
  209.                     if (menucomment[menunum]==NULL) exit(-1);
  210.                     sscanf ( ptr, "%s %s",menuitem[menunum],menucomment[menunum]);
  211.                     no_quota(menuitem[menunum]);
  212.                     no_quota(menucomment[menunum]);
  213. //                  printf ( "%d.%s,%s\n", menunum,menuitem[menunum],menucomment[menunum]);
  214.                     menunum ++;
  215.                     //break;
  216.                 }
  217.         }
  218. Next:
  219.     } while ( ! ( feof (filecfg)));
  220.     if (( defaulttime <=0 ) || ( defaulttime >=60))  defaulttime = 60;
  221.  
  222.     fclose (filecfg );
  223. }
  224.  
  225.  
  226. #define DRAW_MENUTEXT(i,c1,c2)                                      \
  227.     window ( x0, y0+i, x1, y0+i );                                  \
  228.     textbackground (c1);                                            \
  229.     clrscr ();                                                      \
  230.     window ( 1, 1, 80, 25 );                                        \
  231.     gotoxy ( x0, y0+i );                                            \
  232.     textbackground (c1);                                            \
  233.     textcolor (c2);                                                 \
  234.     gotoxy ( (x0+x1-strlen(menuitem[i])) /2, y0+i );                \
  235.     cprintf ("%s", menuitem[i]);                                    \
  236.     textbackground (BLUE);                                          \
  237.  
  238.  
  239. //  textcolor (c1);                                                 \
  240. //  gotoxy ( x0, y0+i );                                            \
  241. //  cprintf ("%s", "                 ");                            \
  242.  
  243.  
  244. #define DRAW_MENUCOMMENT(i )                                        \
  245.     gotoxy(1,21);                                                   \
  246.     clreol();                                                       \
  247.     gotoxy ( ( 80 -strlen(menucomment[i]))/2, 21 );                 \
  248.     textcolor (GREEN);                                              \
  249.     cprintf ("%s", menucomment [i] );
  250.  
  251.  
  252. //  window ( 1, y0+ menunum+2 , 80, 21 );                           \
  253. //  clrscr ();                                                      \
  254. //  window ( 1,1,80,25);                                            \
  255.  
  256. int getmenu()
  257. {
  258. //  #define MESSAGE "Press ENTER When Selected"
  259.   int i;
  260.   int x0,y0,x1,y1;
  261.   int width,height;
  262.   int linespc;
  263.  
  264. //  Show Menu
  265.     //  Draw title
  266.     if ( menunum <= 0 ) return -1 ;
  267.  
  268.     face();
  269.  
  270.     // Draw Menus Line
  271.     linespc =0;
  272.     for (i=0;i<menunum;i++){
  273.         if (strlen(menuitem[i]) > linespc ) linespc =strlen(menuitem[i]);
  274.     }
  275.     linespc = max (20, linespc );
  276.     x0= (80 - linespc )/2;
  277.     x1= (80 + linespc )/2;
  278.     y0=10; y1=y0+menunum-1;
  279.     window(x0-1,y0-1,x1+1,y1+1);
  280.     clrscr();
  281.     window(1,1,80,25);
  282.     rect(x0-1,y0-1,x1+1,y1+1,1);
  283. //  Do not use window because later clock will write in the whole window
  284. //  window(x0-1,y0-1,x1+1,y1+1);
  285.  
  286.     // draw menus
  287.     for (i=0;i<menunum; i++){
  288.         gotoxy ( (x0+x1-strlen(menuitem[i]))/2, y0+  i );
  289.         cprintf ( "%s", menuitem[i] ) ;
  290.     }
  291.  
  292.     // Select the default
  293.     menuselect=menudefault;
  294.     DRAW_MENUTEXT(menuselect ,YELLOW,  BLUE);
  295.     DRAW_MENUCOMMENT(menuselect );
  296. //  siren(2, DELAY, RATE);
  297.   int   keypressed =0;
  298.  
  299.     do  {
  300.         if (timechanged != 0 ) {
  301.             time ( &timer);
  302.             textcolor (WHITE);
  303.             gotoxy ( 54,24);
  304.             cprintf ("%s", ctime (&timer));
  305.             timechanged =0;
  306.  
  307.             gotoxy ( 40,24);
  308.             cprintf ("%2d",  defaulttime );
  309.             ;
  310.             if ( defaulttime <= 0) break;
  311.         }
  312.         if (! keypressed ) siren(3, DELAY, RATE);
  313.         if (!kbhit()) continue;
  314.         keypressed =1;
  315.  
  316.         defaulttime =60;
  317.         ch[0] = getch();
  318.         ch[1] = '\0';
  319.         if( strlen( ch ) == 1) {
  320.             if  ( ch[0] == 0x1b ) {  //0x1b=27=ESC
  321.                 siren(1, DELAY, RATE);
  322.                 menuselect = -1;
  323.                 break;
  324.             } else
  325.             if( ch[0] == 13 ) {     //13=ENTER
  326.                 siren(0, DELAY, RATE);
  327.                 break;
  328.             }
  329.         } else  {   //ch[0]=0, LEFT, RIGHT, UP, DOWN keys
  330.             ch[1]=getch();
  331.             if ((ch[1]=='K') || (ch[1]=='H')) { //Left='K', Up='H'
  332.                 DRAW_MENUTEXT(menuselect , BLUE ,  WHITE );
  333.                 menuselect --;
  334.                 if ( menuselect < 0 ) menuselect =menunum -1;
  335.                 DRAW_MENUTEXT(menuselect , YELLOW , BLUE  );
  336.                 DRAW_MENUCOMMENT(menuselect );
  337.                 siren(0, DELAY / 10, RATE );
  338.             } else
  339.             if ((ch[1]=='M') || (ch[1]=='P')) { //Right='M', Down='M'
  340.                 DRAW_MENUTEXT(menuselect , BLUE ,  WHITE );
  341.                 menuselect ++;
  342.                 if ( menuselect >= menunum ) menuselect = 0;
  343.                 DRAW_MENUTEXT(menuselect , YELLOW , BLUE  );
  344.                 DRAW_MENUCOMMENT(menuselect );
  345.                 siren(0, DELAY / 10, RATE );
  346.             }
  347.         }
  348.     } while( 1 );
  349.  
  350.     return ( menuselect + 1 );
  351. }
  352.  
  353.  
  354. int main(int argc,char *argv[])
  355. {
  356.   int retvalue=0;
  357.  
  358. char drive[MAXDRIVE];
  359. char dir[MAXDIR];
  360. char file[MAXFILE];
  361. char ext[MAXEXT];
  362. char path[80];
  363.  
  364.     strcpy (path, argv[0] );
  365.     fnsplit(path,drive,dir,file,ext);
  366.     strcpy (path, file );
  367.     strcat (path, "." );
  368.     strcat (path, "CFG" );
  369.  
  370.     readcfg(path);
  371.  
  372.     oldhandler = getvect(INTR);
  373.     setvect(INTR, handler);
  374.  
  375.     color1=CYAN;
  376.     color2=BLUE;
  377.  
  378.     retvalue=getmenu();
  379.  
  380.     setvect(INTR, oldhandler);
  381.  
  382.     while ( menunum > 0 ) {
  383.         free ( menuitem[menunum-1]);
  384.         free ( menucomment[menunum-1]);
  385.         menunum--;
  386.     }
  387.     return retvalue;
  388. }
  389.  
  390.  
  391. void    zxexit()
  392. {
  393. system("mode co80");
  394. exit(1);
  395. }
  396.